home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 095 < prev    next >
Text File  |  1995-04-26  |  70KB  |  1,963 lines

  1. C.S.M.P. Digest             Tue, 25 Apr 95       Volume 3 : Issue 95
  2.  
  3. Today's Topics:
  4.  
  5.         Debugging Memory Manager--Caution
  6.         DragManager problem [Q]
  7.         How to launch an application with a file?
  8.         Offscreenage-Animation-Concepts?
  9.         Time Manager Puzzle
  10.         Unsigned Integers?
  11.         [Q] Byte Reversal
  12.         [Q] Getting a list of vRefNums
  13.         __MAC__?
  14.  
  15.  
  16.  
  17. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  18. (pottier@clipper.ens.fr).
  19.  
  20. The digest is a collection of article threads from the internet newsgroup
  21. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  22. regularly and want an archive of the discussions.  If you don't know what a
  23. newsgroup is, you probably don't have access to it.  Ask your systems
  24. administrator(s) for details.  If you don't have access to news, you may
  25. still be able to post messages to the group by using a mail server like
  26. anon.penet.fi (mail help@anon.penet.fi for more information).
  27.  
  28. Each issue of the digest contains one or more sets of articles (called
  29. threads), with each set corresponding to a 'discussion' of a particular
  30. subject.  The articles are not edited; all articles included in this digest
  31. are in their original posted form (as received by our news server at
  32. nef.ens.fr).  Article threads are not added to the digest until the last
  33. article added to the thread is at least two weeks old (this is to ensure that
  34. the thread is dead before adding it to the digest).  Article threads that
  35. consist of only one message are generally not included in the digest.
  36.  
  37. The digest is officially distributed by two means, by email and ftp.
  38.  
  39. If you want to receive the digest by mail, send email to listserv@ens.fr
  40. with no subject and one of the following commands as body:
  41.     help                                Sends you a summary of commands
  42.     subscribe csmp-digest Your Name     Adds you to the mailing list
  43.     signoff csmp-digest                 Removes you from the list
  44. Once you have subscribed, you will automatically receive each new
  45. issue as it is created.
  46.  
  47. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  48. Questions related to the ftp site should be directed to
  49. scott.silver@dartmouth.edu.
  50.  
  51. -------------------------------------------------------
  52.  
  53. >From jwbaxter@olympus.net (John W. Baxter)
  54. Subject: Debugging Memory Manager--Caution
  55. Date: Thu, 30 Mar 1995 00:13:04 -0800
  56. Organization: Internet for the Olympic Peninsula
  57.  
  58. The Debugging Memory Manager arrived on the April Developer CD.  It does
  59. what it says it does, but is not trouble-free on my 8100/80 running System
  60. 7.5.1:
  61.  
  62. WIth the extra checking turned off:
  63.  
  64. Finder is gigged twice during startup for bad pointers.
  65.  
  66. The blocks containing bits behind menus (including popups) appear to have
  67. the disposed memory pattern written into them before the area behind the
  68. menus is restored.  The result is actually rather colorful.
  69.  
  70. Lots more bad pointers/handles/exceptions caught if checking is actually
  71. turned on...the secret to operating a menu is to use one hand on the
  72. mouse, and the other to command-G one's way through MacsBug.  Eventually,
  73. you get to the Debugging Memory Manager control panel.
  74.  
  75. I've done some conflict-searching, but seemingly not enough.  Apple Menu
  76. Options is an obvious suspect:  not guilty.  Leonard R's OSA Menu is also
  77. a likely suspect: not guilty.  Several others are clean, too.
  78.  
  79. Fortunately, the removal button in the installer seems to remove successfully.
  80.  
  81. Don't install this thing just before the big show-and-tell for the boss!
  82.  
  83. Anyone else having problems?
  84.  
  85. --John
  86.  
  87. -- 
  88. John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
  89.        Isn't C fun?
  90.    jwbaxter@pt.olympus.net
  91.  
  92. +++++++++++++++++++++++++++
  93.  
  94. >From jwbaxter@olympus.net (John W. Baxter)
  95. Date: Thu, 30 Mar 1995 00:32:41 -0800
  96. Organization: Internet for the Olympic Peninsula
  97.  
  98. In article <jwbaxter-3003950013040001@ptpm013.olympus.net>,
  99. jwbaxter@olympus.net (John W. Baxter) wrote:
  100.  
  101. > The Debugging Memory Manager arrived on the April Developer CD.  It does
  102. > what it says it does, but is not trouble-free on my 8100/80 running System
  103. > 7.5.1:
  104. Tale of woe omitted
  105.  
  106.  
  107. The guilty party appears to be the most obvious suspect of all ("the
  108. butler did it"):  RamDoubler (1.5.1).
  109.  
  110. With that disabled and lots of checking turned on, I did see a -104
  111. "unexpected quit" from SimpleText, after I quit SimpleText.  Nothing else.
  112.  
  113.    --John (sorry about the self-reply)
  114.  
  115. -- 
  116. John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
  117.        Isn't C fun?
  118.    jwbaxter@pt.olympus.net
  119.  
  120. +++++++++++++++++++++++++++
  121.  
  122. >From ejw@pacersoft.com (Erik James Walter)
  123. Date: Mon, 03 Apr 1995 15:33:45 -0400
  124. Organization: Pacer Software, Inc.
  125.  
  126. In article <jwbaxter-3003950013040001@ptpm013.olympus.net>,
  127. jwbaxter@olympus.net (John W. Baxter) wrote:
  128.  
  129. > The Debugging Memory Manager arrived on the April Developer CD.  It does
  130. > what it says it does, but is not trouble-free on my 8100/80 running System
  131. > 7.5.1:
  132. > WIth the extra checking turned off:
  133. > Finder is gigged twice during startup for bad pointers.
  134. > The blocks containing bits behind menus (including popups) appear to have
  135. > the disposed memory pattern written into them before the area behind the
  136. > menus is restored.  The result is actually rather colorful.
  137. > Lots more bad pointers/handles/exceptions caught if checking is actually
  138. > turned on...the secret to operating a menu is to use one hand on the
  139. > mouse, and the other to command-G one's way through MacsBug.  Eventually,
  140. > you get to the Debugging Memory Manager control panel.
  141. > I've done some conflict-searching, but seemingly not enough.  Apple Menu
  142. > Options is an obvious suspect:  not guilty.  Leonard R's OSA Menu is also
  143. > a likely suspect: not guilty.  Several others are clean, too.
  144. > Fortunately, the removal button in the installer seems to remove successfully.
  145. > Don't install this thing just before the big show-and-tell for the boss!
  146. > Anyone else having problems?
  147.  
  148. I am having similiar problems, but I don't have RamDoubler installed. 
  149. This is on a 7.1.2 system.  I get the annoying (but colorful) menus and
  150. have to spend my time doing the cmd-G switching (I've found that turning
  151. off debugger breaks also helps).
  152.  
  153. I'm going to do some binary searching of the init's and report back
  154.  
  155. Erik
  156.  
  157. +-------------------------------------------+-----------------------+
  158. | [.signature pending FDA approval]         |  Erik James Walter    |
  159. |                                           |  Mac Engineer         |
  160. |                                           |  Pacer Software, Inc. |
  161. +-------------------------------------------+-----------------------+
  162.  
  163. +++++++++++++++++++++++++++
  164.  
  165. >From William Knott <knott@apple.com>
  166. Date: Tue, 4 Apr 1995 18:33:10 GMT
  167. Organization: Apple Computer
  168.  
  169. In article <jwbaxter-3003950013040001@ptpm013.olympus.net> John W.
  170. Baxter, jwbaxter@olympus.net writes:
  171. >The Debugging Memory Manager arrived on the April Developer CD.  It does
  172. >what it says it does, but is not trouble-free on my 8100/80 running System
  173. >7.5.1:
  174. >
  175.  
  176. Version 1.0.1 of the Debugging Memory Manager is incompatable with Virtual
  177. Memory.  Turning off VM should solve most of your problems.  Version 
  178. 1.0.2 of DMMM has resolved this problem.  Version 1.0.2 will be
  179. distributed
  180. on the May 1995 developer CD.
  181.  
  182. Any additional problems, please send eMail to :
  183.  
  184.      DMMM@Powertalk.apple.com
  185.  
  186. Thanks and sorry for any inconveniences
  187.  
  188. -Bill
  189.  
  190. +++++++++++++++++++++++++++
  191.  
  192. >From jwbaxter@olympus.net (John W. Baxter)
  193. Date: Fri, 07 Apr 1995 07:18:52 -0700
  194. Organization: Internet for the Olympic Peninsula
  195.  
  196. In article <ejw-0304951533450001@ejwmac.pacersoft.com>, ejw@pacersoft.com
  197. (Erik James Walter) wrote:
  198.  
  199. > In article <jwbaxter-3003950013040001@ptpm013.olympus.net>,
  200. > jwbaxter@olympus.net (John W. Baxter) wrote:
  201. > > The Debugging Memory Manager arrived on the April Developer CD.  It does
  202. > > what it says it does, but is not trouble-free on my 8100/80 running System
  203. > > 7.5.1:
  204. > > 
  205. > > WIth the extra checking turned off:
  206. > > 
  207. > > Finder is gigged twice during startup for bad pointers.
  208.  
  209. > > [etc from JWB]
  210. > I am having similiar problems, but I don't have RamDoubler installed. 
  211. > This is on a 7.1.2 system.  I get the annoying (but colorful) menus and
  212. > have to spend my time doing the cmd-G switching (I've found that turning
  213. > off debugger breaks also helps).
  214. > I'm going to do some binary searching of the init's and report back
  215.  
  216. The problem lies with Debugging Modern Memory Manager version 1.0.1, which
  217. does not work with Virtual Memory (or RamDoubler).  Soon there should be a
  218. version 1.0.2 available, which does work with VM (I haven't tried it with
  219. RamDoubler...switching to VM has ended some other problems on my
  220. machine).  However, you probably don't WANT to use it with virtual memory
  221. (at least if you have it set to write patterns into free blocks).  Unless
  222. your Mac is too fast and you need to relax.
  223.  
  224.    --John
  225.  
  226. -- 
  227. John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
  228.        Isn't C fun?
  229.    jwbaxter@pt.olympus.net
  230.  
  231. +++++++++++++++++++++++++++
  232.  
  233. >From jhiggins@mathworks.com (John Higgins)
  234. Date: Sun, 09 Apr 1995 18:44:11 -0400
  235. Organization: The MathWorks, Inc.
  236.  
  237. In article <1995Apr4.183310.28450@gallant.apple.com>, William Knott
  238. <knott@apple.com> wrote:
  239.  
  240. > Any additional problems, please send eMail to :
  241. >      DMMM@Powertalk.apple.com
  242. > Thanks and sorry for any inconveniences
  243. > -Bill
  244.  
  245. The README says to "continue" when PC Exchange causes an error at boot
  246. time.  I am running Jasik's Debugger, and I cannot seem to get past this
  247. error.  My machine (8100/110, System 7.5.1) hangs.
  248.  
  249. ======================
  250. John Higgins
  251. jhiggins@mathworks.com
  252. The MathWorks, Inc.
  253. 508-653-1415
  254.  
  255. ---------------------------
  256.  
  257. >From dat93rli@ludat.lth.se (Rune Lindman)
  258. Subject: DragManager problem [Q]
  259. Date: 29 Mar 1995 14:59:19 GMT
  260. Organization: Lund Institute of Technology, Sweden
  261.  
  262. I have a problem with the DragManager in my application.
  263. I use a HFSFlavor along with my own type when creating a
  264. drag event. Everything works fine (dragging between my own
  265. documents, dragging to applications installed in Malph and 
  266. dragging to directories/discs in the finder). 
  267.  
  268. What I cant get to work is draggin to application icons in 
  269. the Finder, the icon highlights but the drag is refused.
  270. Has anyone got this to works?
  271.  
  272. Please help, Im completely stuck...
  273.  
  274. / Rune Lindman
  275.  
  276. -- 
  277. S-mail: Rune Lindman  | E-mail:  dat93rli@ludat.lth.se |  Computer Science  
  278.         Slojdgatan 11 |          lindman@df.lth.se     |  Lund University   
  279.         227 36 Lund   | Fidonet: 2:200/433.2           |------------------
  280.         Sweden        | Tel/Fax: +46-46-137045         |      2B|^2B        
  281.  
  282. +++++++++++++++++++++++++++
  283.  
  284. >From jens_alfke@powertalk.apple.com (Jens Alfke)
  285. Date: Wed, 5 Apr 1995 16:04:37 GMT
  286. Organization: Apple Computer, Inc.
  287.  
  288. In article <3lh82m$he7@symiserver.symantec.com>, Mark Romano
  289. <mromano@bedford.symantec.com> wrote:
  290.  
  291. > I see the same thing (with HFSFlavor and PromiseHFSFlavor).
  292. > It is apparently a bug in the Finder! (7.1, 7.5, 7.5.1)
  293.  
  294. No it isn't, I've written code that drags to the Finder, and there's a
  295. sample app that comes with the Drag Manager that demonstrates it too. You
  296. do have to dot all the i's and cross all the t's to get the
  297. PromiseHFSFlavor to work.
  298.  
  299.  
  300. Jens Alfke_________OpenDoc Geometer_________jens_alfke@powertalk.apple.com
  301.                                            OpenDoc info: FTP to CILabs.org
  302.  
  303.          Visit Scenic Flood Control Dam No. 3.      
  304.  
  305. +++++++++++++++++++++++++++
  306.  
  307. >From lindman@df.lth.se (Rune Lindman)
  308. Date: Sun, 9 Apr 1995 09:35:23 GMT
  309. Organization: Lund University Computing Center
  310.  
  311. In article <jens_alfke-0504951704370001@jensothermac.apple.com>,
  312. jens_alfke@powertalk.apple.com (Jens Alfke) wrote:
  313.  
  314. >In article <3lh82m$he7@symiserver.symantec.com>, Mark Romano
  315. ><mromano@bedford.symantec.com> wrote:
  316. >
  317. >> I see the same thing (with HFSFlavor and PromiseHFSFlavor).
  318. >> It is apparently a bug in the Finder! (7.1, 7.5, 7.5.1)
  319. >
  320. >No it isn't, I've written code that drags to the Finder, and there's a
  321. >sample app that comes with the Drag Manager that demonstrates it too. You
  322. >do have to dot all the i's and cross all the t's to get the
  323. >PromiseHFSFlavor to work.
  324. >
  325. >
  326. >Jens Alfke_________OpenDoc Geometer_________jens_alfke@powertalk.apple.com
  327. >                                           OpenDoc info: FTP to CILabs.org
  328. >
  329. >         Visit Scenic Flood Control Dam No. 3.      
  330.  
  331. I am the original poster.
  332.  
  333. I don't think we are talking about the same thing here.
  334. As I wrote earlier dragging to the Finder works fine.
  335. But creating an HFSFlavor for a document file in my program
  336. and then dragging that *onto an application icon* in the Finder
  337. does not work. The icon gets highlighted but the drag is
  338. refused. I haven't seen any program that does this, not even
  339. Greg's Browser. Is this supposed to work (am I doing something 
  340. wrong here)?. However it works just fine to drag to an application
  341. installed in Malph.
  342.  
  343. I would really appreciate some info on this one since I'm going
  344. to release the application soon.
  345.  
  346. Regards Rune Lindman.
  347.  
  348. -- 
  349. S-mail: Rune Lindman  | E-mail:  dat93rli@ludat.lth.se |  Computer Science
  350.         Slojdgatan 11 |          lindman@df.lth.se     |  Lund University
  351.         227 36 Lund   | Fidonet: 2:200/433.2           |------------------
  352.         Sweden        | Tel/Fax: +46-46-137045         |      2B|^2B
  353.  
  354. +++++++++++++++++++++++++++
  355.  
  356. >From greg@math.harvard.edu (Gregory D. Landweber)
  357. Date: Sun, 09 Apr 1995 11:18:01 -0400
  358. Organization: Harvard University
  359.  
  360. In article <lindman-0904951135160001@llv95mla.student.lu.se>,
  361. lindman@df.lth.se (Rune Lindman) wrote:
  362.  
  363. > But creating an HFSFlavor for a document file in my program
  364. > and then dragging that *onto an application icon* in the Finder
  365. > does not work. The icon gets highlighted but the drag is
  366. > refused. I haven't seen any program that does this, not even
  367. > Greg's Browser. Is this supposed to work (am I doing something 
  368. > wrong here)?. However it works just fine to drag to an application
  369. > installed in Malph.
  370.  
  371. The System 7.5 Find File app can do this, and the next version of
  372. Greg's Browser (due out in about a week) will do this as well.
  373.  
  374. Yes, this is a bug in the Finder, but it is easy to get around.  Although
  375. the Finder will highlight applications when you drag over them, it returns
  376. a userCancelledError when you drop.  However, it does set the drop location
  377. correctly.  So, if you receive a userCancelledError, call GetDropLocation()
  378. to see if the drop location has been set.  If it has, launch the application
  379. yourself and send it an ODOC AppleEvent for the dropped files.
  380.  
  381. -- Greg Landweber
  382.    greg@math.harvard.edu
  383. (author of "Greg's Buttons" and "Greg's Browser")
  384.  
  385. ---------------------------
  386.  
  387. >From aa576@FreeNet.Carleton.CA (Robert Hilchie)
  388. Subject: How to launch an application with a file?
  389. Date: Fri, 7 Apr 1995 15:46:58 GMT
  390. Organization: The National Capital FreeNet
  391.  
  392. First, let me thank Leonard Rosenthol for sending me the example code for
  393. launching a file using finder events. It works like a charm. By the way,
  394. where are these finder events documented?
  395.  
  396. Anyway, my question is this: how do I launch an application so that on
  397. startup it opens a particular file, given file specs for the application
  398. and file? I tried to do it by placing a kAEOpenDocuments apple event in the
  399. launchAppParameters field of the LaunchParamBlockRec of LaunchApplication(),
  400. without much success. Perhaps I'm not forming the apple event correctly.
  401. What target ID do I specify, since the application which receives the event
  402. is not running yet? And where do I copy the message buffer from? From the
  403. apple event's dataHandle? Is this the correct approach? Does anyone out there
  404. have some example code to do this? Thanks,
  405.                                             Rob Hilchie
  406.                                             aa576@FreeNet.Carleton.CA
  407.  
  408. +++++++++++++++++++++++++++
  409.  
  410. >From skevill@tartarus.uwa.edu.au (Scott Kevill)
  411. Date: 8 Apr 1995 04:05:01 GMT
  412. Organization: The University of Western Australia
  413.  
  414. Robert Hilchie (aa576@FreeNet.Carleton.CA) wrote:
  415. : First, let me thank Leonard Rosenthol for sending me the example code for
  416. : launching a file using finder events. It works like a charm. By the way,
  417. : where are these finder events documented?
  418.  
  419. : Anyway, my question is this: how do I launch an application so that on
  420. : startup it opens a particular file, given file specs for the application
  421. : and file? I tried to do it by placing a kAEOpenDocuments apple event in the
  422. : launchAppParameters field of the LaunchParamBlockRec of LaunchApplication(),
  423. : without much success. Perhaps I'm not forming the apple event correctly.
  424. : What target ID do I specify, since the application which receives the event
  425. : is not running yet? And where do I copy the message buffer from? From the
  426. : apple event's dataHandle? Is this the correct approach? Does anyone out there
  427. : have some example code to do this? Thanks,
  428. :                                             Rob Hilchie
  429. :                                             aa576@FreeNet.Carleton.CA
  430.  
  431. It sounds like you mustn't be forming the apple event correctly.
  432. Here is a function that should do what you want, not sure where I got
  433. it from.
  434.  
  435. Hope this helps.
  436.  
  437. Scott Kevill
  438.  
  439. skevill@tartarus.uwa.edu.au
  440.  
  441. - -----
  442.  
  443. OSErr LaunchApplicationWithDocument(const FSSpec * applicationFSSpecPtr,
  444.                                     const FSSpec * documentFSSpecPtr)
  445. {
  446.     OSErr retCode;
  447.     LaunchParamBlockRec launchParams;
  448.     ProcessSerialNumber myPSN;
  449.     AppleEvent theAppleEvent;
  450.     AEDesc myAddrDesc, launchParamDesc, docDesc;
  451.     AEDescList docDescList;
  452.     AliasHandle docAlias;
  453.     
  454.     // to simplify cleanup, ensure that handles are nil to start
  455.     theAppleEvent.dataHandle = nil;
  456.     launchParamDesc.dataHandle = nil;
  457.     docDescList.dataHandle = nil;
  458.     docDesc.dataHandle = nil;
  459.     docAlias = nil;
  460.     
  461.     // the Apple event will need a valid address descriptor (even
  462.     // though its contents will not matter since we will not be
  463.     // calling AESend) so make one using my own serial number
  464.     
  465.     (void) GetCurrentProcess(&myPSN);
  466.     retCode = AECreateDesc(typeProcessSerialNumber, (Ptr) &myPSN,
  467.         sizeof(ProcessSerialNumber), &myAddrDesc);
  468.     if (retCode != noErr) goto Bail;
  469.     
  470.     // make a descriptor list containing just a descriptor with an
  471.     // alias to the document
  472.     
  473.     retCode = AECreateList(nil, 0, false, &docDescList);
  474.     if (retCode != noErr) goto Bail;
  475.     
  476.     retCode = NewAlias(nil, documentFSSpecPtr, &docAlias);
  477.     if (retCode != noErr) goto Bail;
  478.     
  479.     HLock((Handle) docAlias);
  480.     retCode = AECreateDesc(typeAlias, (Ptr) *docAlias, 
  481.         GetHandleSize((Handle) docAlias), &docDesc);
  482.     HUnlock((Handle) docAlias);
  483.     if (retCode != noErr) goto Bail;
  484.     
  485.     retCode = AEPutDesc(&docDescList, 0, &docDesc);
  486.     if (retCode != noErr) goto Bail;
  487.     
  488.     // now make the 'odoc' AppleEvent descriptor and insert the 
  489.     // document descriptor list as the direct object
  490.     
  491.     retCode = AECreateAppleEvent(kCoreEventClass, kAEOpenDocuments,
  492.         &myAddrDesc, kAutoGenerateReturnID, kAnyTransactionID,
  493.         &theAppleEvent);
  494.     if (retCode != noErr) goto Bail;
  495.     
  496.     retCode = AEPutParamDesc(&theAppleEvent, keyDirectObject,
  497.                              &docDescList);
  498.     if (retCode != noErr) goto Bail;
  499.     
  500.     // this Apple event will not be sent but rather will be used
  501.     // as a parameter to the LaunchApplication call, so coerce it
  502.     // to the magic type typeAppParamters
  503.     
  504.     retCode = AECoerceDesc(&theAppleEvent, typeAppParameters,
  505.                            &launchParamDesc);
  506.     if (retCode != noErr) goto Bail;
  507.     
  508.     // finally, fill in the launch parameter block, including the
  509.     // Apple event, and make the launch call
  510.     
  511.     HLock((Handle) launchParamDesc.dataHandle);
  512.     launchParams.launchAppParameters =
  513.         (AppParametersPtr) *(launchParamDesc.dataHandle);
  514.         
  515.     launchParams.launchBlockID = extendedBlock;
  516.     launchParams.launchEPBLength = extendedBlockLen;
  517.     launchParams.launchFileFlags = launchNoFileFlags;
  518.     launchParams.launchControlFlags = launchContinue;
  519.     launchParams.launchAppSpec = (FSSpecPtr) applicationFSSpecPtr;
  520.  
  521.     retCode = LaunchApplication(&launchParams);
  522.     
  523. Bail:
  524.     // dispose of everything that was allocated
  525.     
  526.     if (theAppleEvent.dataHandle != nil)   AEDisposeDesc(&theAppleEvent);
  527.     if (launchParamDesc.dataHandle != nil) AEDisposeDesc(&launchParamDesc);
  528.     if (docDescList.dataHandle != nil)     AEDisposeDesc(&docDescList);
  529.     if (docDesc.dataHandle != nil)         AEDisposeDesc(&docDesc);
  530.     if (launchParamDesc.dataHandle != nil) AEDisposeDesc(&launchParamDesc);
  531.     if (docAlias != nil)
  532.         DisposeHandle((Handle) docAlias);
  533.     
  534.     return retCode;
  535.  
  536. }
  537.  
  538. - ----
  539.  
  540.  
  541. ---------------------------
  542.  
  543. >From joec@johnston.jhuapl.edu (JC)
  544. Subject: Offscreenage-Animation-Concepts?
  545. Date: Mon, 27 Mar 1995 13:55:20 +0000
  546. Organization: Johns Hopkins University/Applied Physics Lab
  547.  
  548. I know this has been asked many times, but once again.......
  549.  
  550. 1.  What is the fastest way to animate an object overtop of a background
  551. when each frame is different ?
  552.  
  553. Is the fastest way to copy all my individual images into one offscreen
  554. PICT resource and just pluck out the one I need next for the animation? If
  555. so how does one isolate and extract only a small portion of the offscreen
  556. PICT resource and only draw that smaller image to the main screen instead
  557. of the entire offscreen  (which I assume includes a background). I've
  558. popped Prince of Persia into Resedit but didn't see animation sequences in
  559. a PICT resource. How did they achieve their graphics ?
  560.  
  561. 2. This may be answered by the above response but if not....How does one
  562. update a main screen view which includes a background and animated objects
  563. without redwawing the entire background again only the animated object ?
  564. I've heard of creating a mask but IM is scarce on the subject and the
  565. extensive digging and viewing of code hasn't yielded clues. Is masking the
  566. fastest way ?
  567.  
  568. 3. This is the last question (for now!) I promise!  I've heard of creating
  569. my own graphics routines (instead of using QuickDraw???..) to increase the
  570. speed of drawing. What is it about QuickDraw that makes it too slow and
  571. what exactly will need to improve upon?
  572.  
  573. Many thanks in advance!
  574.  
  575. +++++++++++++++++++++++++++
  576.  
  577. >From al@crucible.powertools.com (Al Evans)
  578. Date: 31 Mar 1995 12:51:28 -0600
  579. Organization: Powertools, Austin, Texas
  580.  
  581. In article <joec-2703951355200001@covingtons-mac.jhuapl.edu>,
  582. JC <joec@johnston.jhuapl.edu> wrote:
  583.  
  584. >1.  What is the fastest way to animate an object overtop of a background
  585. >when each frame is different ?
  586.  
  587. Opinions are likely to vary on lots of this. All I can say is that
  588. these are mine, and I do this stuff for a living:-)
  589.  
  590. Probably the best way is to put all your individual images into one
  591. PICT, draw that PICT into an offscreen GWorld when you initialize your
  592. graphics, and copy rectangles from it as needed. I often expand on this
  593. system to include a resource which contains the source rectangles of
  594. all the individual sub-frames in the PICT.
  595.  
  596. Keep your background in a separate offscreen GWorld -- you'll need pieces
  597. of it to update the on-screen background as the animated images move.
  598.  
  599. >2. This may be answered by the above response but if not....How does one
  600. >update a main screen view which includes a background and animated objects
  601. >without redwawing the entire background again only the animated object ?
  602. >I've heard of creating a mask but IM is scarce on the subject and the
  603. >extensive digging and viewing of code hasn't yielded clues. Is masking the
  604. >fastest way ?
  605.  
  606. Personally, I keep a list of rectangles that need to be redrawn, and
  607. redraw only those rectangles on every animation cycle. Also (personally),
  608. I use a separate offscreen GWorld the size of the background for assembly
  609. of the final image to be copied to the screen. Accepting this additional
  610. overhead in time and memory gives me several advantages. 1) Dealing with
  611. multiple "levels" of overlays is as easy as dealing with one; 2) I can
  612. be clever about merging rectangles on my list of dirty Rects, since only
  613. the rectangles on the list need to be guaranteed valid on any animation
  614. cycle; 3) I can do all the dirty work in 8-bit mode without demanding that
  615. the user alter his monitor settings to run my software.
  616.  
  617. >3. This is the last question (for now!) I promise!  I've heard of creating
  618. >my own graphics routines (instead of using QuickDraw???..) to increase the
  619. >speed of drawing. What is it about QuickDraw that makes it too slow and
  620. >what exactly will need to improve upon?
  621.  
  622. I find that using custom blitters for any or all offscreen-to-offscreen
  623. copies can be a big win. However, I always use CopyBits() for the final
  624. offscreen-to-onscreen copy. My tests indicate that the slight speed increase
  625. I get from using a custom blitter here (~7%) is not worth the additional
  626. hassle required to support multiple overlapping windows, multiple screens,
  627. multiple graphics modes, etc.
  628.                                         --Al Evans--
  629. -- 
  630. Al Evans                |   Graphic Elements: A new standard for 
  631. ________________________|__ high-performance interactive Macintosh graphics.
  632. al@crucible.powertools.com |  Available from mac.archive.umich.edu
  633. - -------------------------| /mac/development/libraries/graphicelements2.sit.hqx
  634.  
  635. +++++++++++++++++++++++++++
  636.  
  637. >From catambay@aol.com (Bill the Cat)
  638. Date: Mon, 03 Apr 1995 08:21:55 -0800
  639. Organization: Starfleet Academy
  640.  
  641. In article <3lhivg$qcf@crucible.powertools.com>,
  642. al@crucible.powertools.com (Al Evans) wrote:
  643.  
  644. -> In article <joec-2703951355200001@covingtons-mac.jhuapl.edu>,
  645. -> JC <joec@johnston.jhuapl.edu> wrote:
  646. -> 
  647. -> 
  648. -> >3. This is the last question (for now!) I promise!  I've heard of creating
  649. -> >my own graphics routines (instead of using QuickDraw???..) to increase the
  650. -> >speed of drawing. What is it about QuickDraw that makes it too slow and
  651. -> >what exactly will need to improve upon?
  652. -> 
  653. -> I find that using custom blitters for any or all offscreen-to-offscreen
  654. -> copies can be a big win. However, I always use CopyBits() for the final
  655. -> offscreen-to-onscreen copy. My tests indicate that the slight speed increase
  656. -> I get from using a custom blitter here (~7%) is not worth the additional
  657. -> hassle required to support multiple overlapping windows, multiple screens,
  658. -> multiple graphics modes, etc.
  659. ->                                         --Al Evans--
  660.  
  661. I'm interested in learning more about this "custom blitters" stuff. 
  662. Sounds complicated (multiple this and multiple that), but since I'm always
  663. hearing about it, I have a strong curiosity about it.  Can you provide
  664. reading material references?
  665.  
  666. _____________________________________________________________________
  667. Bill Catambay
  668. Pascal Programmer on Macintosh and Open VMS
  669.  
  670.               />
  671.              //   The purpose of software engineering  
  672.      (//////[O]>=========================================-
  673.              \\    is to manage complexity, not to create it.
  674.               \>
  675.  
  676. ____________________________________________________________________
  677.         
  678.  
  679. +++++++++++++++++++++++++++
  680.  
  681. >From al@crucible.powertools.com (Al Evans)
  682. Date: 8 Apr 1995 08:06:15 -0500
  683. Organization: Powertools, Austin, Texas
  684.  
  685. In article <catambay-0304950821550001@129.197.23.15>,
  686. Bill the Cat <catambay@aol.com> wrote:
  687.  
  688. [quotes me saying I use custom blitters for offscreen-to-offscreen copies]
  689.  
  690. >I'm interested in learning more about this "custom blitters" stuff. 
  691. >Sounds complicated (multiple this and multiple that), but since I'm always
  692. >hearing about it, I have a strong curiosity about it.  Can you provide
  693. >reading material references?
  694.  
  695. I don't really know if there *is* any reading material on custom blitters
  696. for the Mac. The two references I can think of offhand are the Usenet
  697. Mac Programmer's Guide (does this still exist?) and the code in Tony
  698. Myles' SpriteWorld. There are probably others I don't know of.
  699.  
  700. *I* use custom blitters for two reasons. First, when I *know*
  701. what the environment is -- for example, if it's offscreen-to-offscreen,
  702. 8 bits deep, with no clipping or rectangle-clipping only -- I can save
  703. most or all of the setup time CopyBits uses to determine all these
  704. parameters and choose the correct path through its code. Second,
  705. when I have some special kind of copying to do -- for example, if I'm
  706. doing a "transparent" copy where all pixels of palette index 0 are
  707. simply skipped, or if I want to copy over everything except a particular
  708. shade of blue -- I use a custom blitter.
  709.  
  710. Another good example is the situation where you want to display a
  711. 320X200 bitmap in a 640X480 space -- since you *know* that each pixel
  712. is doubled horizontally and vertically, you can play some tricks to
  713. make the doubling happen "automagically" and save a great deal of time
  714. over CopyBits' scaling.
  715.  
  716. My tests show that custom blitters save significant amounts of time in
  717. these cases, but that for straight copying, particularly offscreen to
  718. onscreen copying, CopyBits is 1) very hard to beat and 2) much more
  719. versatile than anything I want to write.
  720.  
  721.                                         --Al Evans--
  722. -- 
  723. Al Evans                |   Graphic Elements: A new standard for 
  724. ________________________|__ high-performance interactive Macintosh graphics.
  725. al@crucible.powertools.com |  Available from mac.archive.umich.edu
  726. - -------------------------| /mac/development/libraries/graphicelements2.sit.hqx
  727.  
  728. ---------------------------
  729.  
  730. >From jmunkki@beta.hut.fi (Juri Munkki)
  731. Subject: Time Manager Puzzle
  732. Date: 9 Apr 1995 21:26:49 GMT
  733. Organization: Helsinki University of Technology
  734.  
  735. Here's a nice little puzzle that I ran into. I use the time manager to measure
  736. time in milliseconds from a certain point in time. Here's the code that I
  737. use to read the time:
  738.  
  739. long    CSoundMixer::ReadTime()
  740. {
  741.         long    remaining;
  742.         long    timeBase;
  743.         
  744.         RmvTime((QElemPtr)&timerRec.t);
  745.         timeBase = timerRec.timeBase;
  746.         remaining = timerRec.t.tmCount;
  747.         InsXTime((QElemPtr)&timerRec.t);
  748.         PrimeTime((QElemPtr)&timerRec.t, 0);
  749.  
  750.         if(remaining < 0)
  751.                 remaining /= -1000;
  752.  
  753.         return timeBase + CYCLEMILLISECS - remaining;
  754. }
  755.  
  756. Now the application that uses this routine happens to be a sound system and
  757. the current time is needed both from a doubleback routine (interrupt level)
  758. and from the application itself.
  759.  
  760. The challenge is that the interrupt can happen between the RmvTime and
  761. PrimeTime calls and during the period, the current time can not be
  762. read with this method.
  763.  
  764. Here's how I "solved" this puzzle.
  765.  
  766.         Create two time manager tasks and prime them as close to each other
  767.         as possible. Assuming the time manager is reliable, they will measure
  768.         the same time. The other task can be used from the interrupt routine
  769.         and the other one from other places.
  770.  
  771. It seems to work quite well, but it is not a very elegant solution,
  772. so I wonder if anyone has suggestions for a better way to do this.
  773.  
  774. -- 
  775. Juri Munkki jmunkki@hut.fi      There ain't no such thing as a shareware lunch.
  776. http://www.hut.fi/~jmunkki              Windsurfing: Faster than the wind.
  777.  
  778. +++++++++++++++++++++++++++
  779.  
  780. >From reinder@neuretp.biol.ruu.nl (Reinder Verlinde)
  781. Date: Mon, 10 Apr 1995 08:49:09 GMT
  782. Organization: Rijksuniversiteit Utrecht
  783.  
  784. In article <3m9jep$mcm@nukkekoti.cs.hut.fi>, jmunkki@beta.hut.fi (Juri
  785. Munkki) wrote:
  786.  
  787. > Here's a nice little puzzle that I ran into. I use the time manager to measure
  788. > time in milliseconds from a certain point in time. Here's the code that I
  789. > use to read the time:
  790. > ...
  791. > Here's how I "solved" this puzzle.
  792. >         Create two time manager tasks and prime them as close to each other
  793. >         as possible. Assuming the time manager is reliable, they will measure
  794. >         the same time. The other task can be used from the interrupt routine
  795. >         and the other one from other places.
  796. > It seems to work quite well, but it is not a very elegant solution,
  797. > so I wonder if anyone has suggestions for a better way to do this.
  798. > -- 
  799. > Juri Munkki jmunkki@hut.fi      There ain't no such thing as a shareware
  800. lunch.
  801. > http://www.hut.fi/~jmunkki              Windsurfing: Faster than the wind.
  802.  
  803. One nice way (as far as the source code goes) I see is to create a single
  804. time manager task which interrupts every millisecond, and updates a global
  805. variable 'gNumMillis'. This will probably slow down your program, though.
  806.  
  807. A better (probably the only good way) alternative is to disable interrupts
  808. from before 'RmvTime' to after 'PrimeTime', thus implementing a kind of
  809. semaphor around the 'critical section'. Your application won't interrupt
  810. your interrupt, so this half-semaphor will be sufficient.
  811. I don't know (from my head) how to disable interrupts, but source to do
  812. it can be found in the VideoToolbox.
  813.  
  814. Reinder Verlinde
  815.  
  816. +++++++++++++++++++++++++++
  817.  
  818. >From jager@netcom.com (Marcus Jager)
  819. Date: Mon, 10 Apr 1995 17:10:17 GMT
  820. Organization: Mammoth Micro Productions
  821.  
  822. In article <3m9jep$mcm@nukkekoti.cs.hut.fi>, jmunkki@beta.hut.fi (Juri
  823. Munkki) wrote:
  824.  
  825. >Here's a nice little puzzle that I ran into. I use the time manager to measure
  826. >time in milliseconds from a certain point in time. Here's the code that I
  827. >use to read the time:
  828.  
  829. [...code using TimeManager...]
  830.  
  831. >Now the application that uses this routine happens to be a sound system and
  832. >the current time is needed both from a doubleback routine (interrupt level)
  833. >and from the application itself.
  834.  
  835. Can you require that Quicktime is available?
  836. If so the you could use a TimeBase. (See NIM QT 2-315)
  837.  
  838. Create the timer and start it running like this
  839.  
  840.         systemClock = NewTimeBase();
  841.         SetTimeBaseValue(systemClock,0,1000);
  842.         SetTimeBaseRate(systemClock,1L<<16);
  843.  
  844. then get the current millisecond time like this, which is interrupt safe
  845.  
  846.         time = GetTimeBaseTime(systemClock,1000,nil);
  847.  
  848. you can get the time to any resolution like this. (upto the limit of the
  849. default 'clok' component, which claims microsecs accuracy)
  850.  
  851. Marcus.
  852.  
  853. ___________________________________________________________________
  854. Marcus Jager <jager@netcom.com> Mac Programmer      +1-303-237-5776
  855. Mammoth Micro Productions                      Fax: +1-303-237-6475
  856.  
  857. ---------------------------
  858.  
  859. >From kurisuto@babel.ling.upenn.edu (Sean Crist)
  860. Subject: Unsigned Integers?
  861. Date: 7 Apr 1995 16:39:42 GMT
  862. Organization: ABBA Fan Club
  863.  
  864. Arrrgh-- after hacking Macs for five years, I can't believe this is the
  865. first time I've run into this question.  I've checked all my reference
  866. books and haven't found the answer, so here's my question.
  867.  
  868. Is there a kind of Pascal type 'UnsignedInteger' or some such, where the
  869. values are 0 to 65535 rather than -32767 to 32767? (I'm using THINK Pascal,
  870. BTW.)
  871.  
  872. The reason I want this is that I'm taking two RGB colors and performing
  873. various comparisons and calculations on them (e.g. creating a color table
  874. with a continuum of blended shades in between the two original colors)
  875. Since the values for R,G,B start at 0, I want 40000 > 20000 to be true.
  876. But since Pascal's Integer type treats 40000 as -7232, it works out that
  877. 40000 < 20000.  (I think I've got this right.)
  878.  
  879. If I absolutely have to, I can write some very Baroque routines to do these
  880. calculations using ordinary integer-typed variables, but there has to be
  881. some better way.  
  882.  
  883.   \/ __ __    _\_     --Sean Crist  (kurisuto@unagi.cis.upenn.edu)
  884.  ---  |  |    \ /     For a free copy of the Bill of Rights, finger
  885.   _| ,| ,|   -----       this account.
  886.   _| ,| ,|    [_]     Q: What do Standard Oil, AT&T, and Microsoft have in
  887.    |  |  |    [_]        common?   A:  Nothing... yet.
  888.  
  889.  
  890. +++++++++++++++++++++++++++
  891.  
  892. >From dstone@alchemy.chem.utoronto.ca (David Stone)
  893. Date: Fri, 7 Apr 1995 19:28:57 GMT
  894. Organization: University of Toronto Chemistry
  895.  
  896. In article <3m3pse$i1i@netnews.upenn.edu>, kurisuto@babel.ling.upenn.edu
  897. (Sean Crist) wrote:
  898. > Arrrgh-- after hacking Macs for five years, I can't believe this is the
  899. > first time I've run into this question.  I've checked all my reference
  900. > books and haven't found the answer, so here's my question.
  901. > Is there a kind of Pascal type 'UnsignedInteger' or some such, where the
  902. > values are 0 to 65535 rather than -32767 to 32767? (I'm using THINK Pascal,
  903. > BTW.)
  904.  
  905. I don't know about pascal, but in C the RGB colour components are
  906. unsigned short's within the RGBColor data struct
  907.  
  908. Dave Stone
  909.  
  910. +++++++++++++++++++++++++++
  911.  
  912. >From kurisuto@babel.ling.upenn.edu (Sean Crist)
  913. Date: 7 Apr 1995 20:49:38 GMT
  914. Organization: University of Pennsylvania, Linguistics Department
  915.  
  916. In article <dstone-070495153148@csgmac.chem.utoronto.ca>,
  917. David Stone <dstone@alchemy.chem.utoronto.ca> wrote:
  918. >In article <3m3pse$i1i@netnews.upenn.edu>, kurisuto@babel.ling.upenn.edu
  919. >(Sean Crist) wrote:
  920. >> 
  921. >> Arrrgh-- after hacking Macs for five years, I can't believe this is the
  922. >> first time I've run into this question.  I've checked all my reference
  923. >> books and haven't found the answer, so here's my question.
  924. >> 
  925. >> Is there a kind of Pascal type 'UnsignedInteger' or some such, where the
  926. >> values are 0 to 65535 rather than -32767 to 32767? (I'm using THINK Pascal,
  927. >> BTW.)
  928.  
  929. >I don't know about pascal, but in C the RGB colour components are
  930. >unsigned short's within the RGBColor data struct
  931.  
  932. Thanks, but that won't help me; I'm working in Think Pascal and my
  933. application is over 30,000 lines long; it wouldn't be worth it for me to
  934. learn a new language and translate all my code for just this one problem.
  935. :-(
  936.  
  937.   \/ __ __    _\_     --Sean Crist  (kurisuto@unagi.cis.upenn.edu)
  938.  ---  |  |    \ /     For a free copy of the Bill of Rights, finger
  939.   _| ,| ,|   -----       this account.
  940.   _| ,| ,|    [_]     Q: What do Standard Oil, AT&T, and Microsoft have in
  941.    |  |  |    [_]        common?   A:  Nothing... yet.
  942.  
  943.  
  944.  
  945.  
  946. +++++++++++++++++++++++++++
  947.  
  948. >From skevill@tartarus.uwa.edu.au (Scott Kevill)
  949. Date: 8 Apr 1995 04:08:32 GMT
  950. Organization: The University of Western Australia
  951.  
  952. Sean Crist (kurisuto@babel.ling.upenn.edu) wrote:
  953. : Is there a kind of Pascal type 'UnsignedInteger' or some such, where the
  954. : values are 0 to 65535 rather than -32767 to 32767? (I'm using THINK Pascal,
  955. : BTW.)
  956.  
  957. Just declare a type from 0 to 65535.
  958.  
  959.     TYPE
  960.         UnsInt        = 0..65535;
  961.  
  962. Hope this helps.
  963.  
  964. Scott Kevill
  965.  
  966. skevill@tartarus.uwa.edu.au
  967.  
  968.  
  969. +++++++++++++++++++++++++++
  970.  
  971. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  972. Date: Sun, 9 Apr 1995 19:50:56 +1200 (NZDT)
  973. Organization: (none)
  974.  
  975. kurisuto@babel.ling.upenn.edu (Sean Crist) writes:
  976. > Arrrgh-- after hacking Macs for five years, I can't believe this is the
  977. > first time I've run into this question.  I've checked all my reference
  978. > books and haven't found the answer, so here's my question.
  979. >
  980. > Is there a kind of Pascal type 'UnsignedInteger' or some such, where the
  981. > values are 0 to 65535 rather than -32767 to 32767? (I'm using THINK Pascal,
  982. > BTW.)
  983.  
  984. Sorry.  No can do :-(
  985.  
  986.  
  987. > The reason I want this is that I'm taking two RGB colors and performing
  988. > various comparisons and calculations on them (e.g. creating a color table
  989. > with a continuum of blended shades in between the two original colors)
  990. > Since the values for R,G,B start at 0, I want 40000 > 20000 to be true.
  991. > But since Pascal's Integer type treats 40000 as -7232, it works out that
  992. > 40000 < 20000.  (I think I've got this right.)
  993. >
  994. > If I absolutely have to, I can write some very Baroque routines to do these
  995. > calculations using ordinary integer-typed variables, but there has to be
  996. > some better way.  
  997.  
  998. I don't know what anyone else does, but back when I was still using Pascal
  999. I used to do stuff like:
  1000.  
  1001. const fudgefactor = -32768;
  1002.  
  1003. ... and then compare (a + fudgefactor) against (b + fudgefactor).
  1004. This gives all the correct orderings for "unsigned" numbers.
  1005.  
  1006. -- Bruce
  1007.  
  1008. +++++++++++++++++++++++++++
  1009.  
  1010. >From jwbaxter@olympus.net (John W. Baxter)
  1011. Date: Sat, 08 Apr 1995 21:02:48 -0700
  1012. Organization: Internet for the Olympic Peninsula
  1013.  
  1014. In article <3m3pse$i1i@netnews.upenn.edu>, kurisuto@babel.ling.upenn.edu
  1015. (Sean Crist) wrote:
  1016.  
  1017. > Arrrgh-- after hacking Macs for five years, I can't believe this is the
  1018. > first time I've run into this question.  I've checked all my reference
  1019. > books and haven't found the answer, so here's my question.
  1020. > Is there a kind of Pascal type 'UnsignedInteger' or some such, where the
  1021. > values are 0 to 65535 rather than -32767 to 32767? (I'm using THINK Pascal,
  1022. > BTW.)
  1023.  
  1024. No.  [Wirth added an unsigned type to Modula, named CARDINAL.]
  1025.  
  1026. > The reason I want this is that I'm taking two RGB colors and performing
  1027. > various comparisons and calculations on them (e.g. creating a color table
  1028. > with a continuum of blended shades in between the two original colors)
  1029. > Since the values for R,G,B start at 0, I want 40000 > 20000 to be true.
  1030. > But since Pascal's Integer type treats 40000 as -7232, it works out that
  1031. > 40000 < 20000.  (I think I've got this right.)
  1032.  
  1033. Run some tests...there are more problems in thought experiments than there
  1034. are in actual code (because of the actual process of comparing things, and
  1035. the nature of the arithmetic the chip[s] we use perform.  In many cases,
  1036. you'll find that you don't actually have a problem (but I think you've
  1037. cited a case where you do.  [You routinely compare to Mac times, and the
  1038. later one is larger than the earlier one.  But both are negative (negative
  1039. time began in 1972), so the later one is arithmetically smaller).
  1040.  
  1041. > If I absolutely have to, I can write some very Baroque routines to do these
  1042. > calculations using ordinary integer-typed variables, but there has to be
  1043. > some better way.  
  1044.  
  1045. "Plant" your INTEGER into the right-hand two bytes of a LONGINT you've
  1046. previously zeroed.  [-1 is sometimes the right initial state.]  [Using the
  1047. usual anti-Wirth trickery.]  Do your math.  Note whether there are bits to
  1048. the left of the right two bytes of the result, and adjust.  Grab the right
  1049. two bytes.  That covers most cases, if memory serves.  [As long as you
  1050. keep your code on a Pascal compiler which *has* the LONGINT extension, and
  1051. hardware which does 2's complement binary arithmetic.  What I said blows
  1052. away portability to other environments, such as whatever machines remain
  1053. in service doing signed-magnitude integer arithmetic.]
  1054.  
  1055. --John
  1056.  
  1057. -- 
  1058. John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
  1059.        Isn't C fun?
  1060.    jwbaxter@pt.olympus.net
  1061.  
  1062. +++++++++++++++++++++++++++
  1063.  
  1064. >From jwbaxter@olympus.net (John W. Baxter)
  1065. Date: Tue, 11 Apr 1995 20:03:24 -0700
  1066. Organization: Internet for the Olympic Peninsula
  1067.  
  1068. In article <3m5280$mdk@styx.uwa.edu.au>, skevill@tartarus.uwa.edu.au
  1069. (Scott Kevill) wrote:
  1070.  
  1071. > Sean Crist (kurisuto@babel.ling.upenn.edu) wrote:
  1072. > : Is there a kind of Pascal type 'UnsignedInteger' or some such, where the
  1073. > : values are 0 to 65535 rather than -32767 to 32767? (I'm using THINK Pascal,
  1074. > : BTW.)
  1075. > Just declare a type from 0 to 65535.
  1076. >     TYPE
  1077. >         UnsInt        = 0..65535;
  1078.  
  1079. Well, that can be declared.  But it's a subrange of LONGINT, and is four
  1080. bytes wide (in the Pascal implementations I'm familiar with.  [Just as
  1081. 0..255 is two bytes wide.]
  1082.  
  1083. Standard Pascal doesn't do unsigned, and with the Macintosh Pascals are
  1084. extended in various ways (as are all useful Pascals, the one's I've used
  1085. aren't extended in the direction of unsigned).
  1086.    --John
  1087.  
  1088. -- 
  1089. John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
  1090.        Isn't C fun?
  1091.    jwbaxter@pt.olympus.net
  1092.  
  1093. ---------------------------
  1094.  
  1095. >From chris-b@cs.auckland.ac.nz (chris-b)
  1096. Subject: [Q] Byte Reversal
  1097. Date: Tue, 04 Apr 1995 15:55:04 +1200
  1098. Organization: HyperMedia Unit, Comp Sci, Auckland University
  1099.  
  1100. Hi All,
  1101.  
  1102. I'm reading audio data from an audio CD and playing it with Sound Manager
  1103. 3.0. The CD data however, is little endian. So I need to byte swap pairs
  1104. in-place.
  1105.  
  1106. I have a handle to a buffer containing the audio data, each four bytes
  1107. contains a left and right sample (each 16 bits). The bytes within each
  1108. sample need reversing.
  1109.  
  1110. Currently my code looks something like this:
  1111.  
  1112. - -----------------------------------------------------------------------------
  1113.  
  1114. Handle  AudioData;
  1115. UInt32  i;
  1116. UInt32  Frame;
  1117.  
  1118.     for (i = 0;i < 441000;i++)
  1119.     {
  1120.         Frame = ((UInt32*)(*AudioData))[i];
  1121.         Frame = ((Frame >> 8) & 0x00FF00FF) | ((Frame << 8) & 0xFF00FF00);
  1122.         ((UInt32*)(*AudioData))[i] = Frame;
  1123.     }
  1124.  
  1125. - -----------------------------------------------------------------------------
  1126.  
  1127. Does anybody have a better version (in C, for 68K or PPC)? Please post it
  1128. and forward me an e-mail copy. 
  1129.  
  1130. Thanks In Advance,
  1131.  
  1132. Chris B
  1133. - ---------------------------------------------------------------------
  1134. NewZealand:AucklandUniversity:ComputerScience:HyperMediaUnit:ChrisBurns
  1135. Internet: chris-b@cs.auckland.ac.nz
  1136. Phone:    +64 9 373-7599 x6194
  1137. Fax:      +64 9 373-7453                         Async, therefore I am.
  1138. - ---------------------------------------------------------------------
  1139.  
  1140. +++++++++++++++++++++++++++
  1141.  
  1142. >From chris-b@cs.auckland.ac.nz (chris-b)
  1143. Date: Tue, 04 Apr 1995 19:17:54 +1200
  1144. Organization: HyperMedia Unit, Comp Sci, Auckland University
  1145.  
  1146. In article <chris-b-0404951555040001@hmu7.cs.auckland.ac.nz>,
  1147. chris-b@cs.auckland.ac.nz wrote:
  1148.  
  1149. >So I need to byte swap pairs in-place.
  1150. >
  1151. >I have a handle to a buffer containing the audio data, each four bytes
  1152. >contains a left and right sample (each 16 bits). The bytes within each
  1153. >sample need reversing.
  1154.  
  1155. The latest version goes something like this:
  1156.  
  1157. - -----------------------------------------------------------------------------
  1158.  
  1159. UInt32      *FramePtr;
  1160. UInt32      *FrameEnd;
  1161. UInt32      Frame;
  1162.  
  1163.  
  1164.     for (FramePtr = (UInt32*)*AudioData,FrameEnd = FramePtr +
  1165. 441000;FramePtr < FrameEnd;FramePtr++)
  1166.     {
  1167.         Frame = *FramePtr;
  1168.         Frame = ((Frame >> 8) & 0x00FF00FF) | ((Frame << 8) & 0xFF00FF00);
  1169.         *FramePtr = Frame;
  1170.     }
  1171.  
  1172. - -----------------------------------------------------------------------------
  1173.  
  1174. Does anybody have a better version (in C, for 68K or PPC)? Please post it
  1175. and forward me an e-mail copy. 
  1176.  
  1177. Thanks In Advance,
  1178.  
  1179. Chris B
  1180. - ---------------------------------------------------------------------
  1181. NewZealand:AucklandUniversity:ComputerScience:HyperMediaUnit:ChrisBurns
  1182. Internet: chris-b@cs.auckland.ac.nz
  1183. Phone:    +64 9 373-7599 x6194
  1184. Fax:      +64 9 373-7453                         Async, therefore I am.
  1185. - ---------------------------------------------------------------------
  1186.  
  1187. +++++++++++++++++++++++++++
  1188.  
  1189. >From jthill@netcom.com (Jim Hill)
  1190. Date: Tue, 4 Apr 1995 16:48:53 GMT
  1191. Organization: biological <-- hey, a one-word oxymoron!
  1192.  
  1193. On my PPC/5.5, this code is about 30% faster at UNROLL 1, about 40% faster
  1194. at UNROLL 2, and about 46% faster at UNROLL 4.  If you're doing this more
  1195. than a few times, it matters :-)
  1196.  
  1197. The CW PPC optimizer doesn't do real well at dealing with constants.  Some
  1198. other things (maybe doing a little unrolling, especially when you know the
  1199. loop will run for a while, until the schedule doesn't improve much) might
  1200. be nice, too, but most of it's not hoisting the dang constants.
  1201.  
  1202. #define BLKSIZE 441000
  1203. void Obswap(UInt32 **AudioData);
  1204. void bswap(UInt32 (*AudioData)[BLKSIZE]);
  1205.  
  1206. int
  1207. main(void)
  1208. {
  1209.   UInt32 (*AudioData)[BLKSIZE] = (void*)NewPtr(sizeof *AudioData);
  1210.   volatile SInt32 startmine,starthis,endhis,ahis,amine;
  1211.   volatile float aratio;
  1212.   int count;
  1213.   if ( !AudioData )
  1214.     return 0;
  1215.   bswap(AudioData);
  1216.   startmine=LMGetTicks();
  1217.   for ( count = 60 ; count ; --count )
  1218.     bswap(AudioData);
  1219.   starthis=LMGetTicks();
  1220.   for ( count = 60 ; count ; --count )
  1221.     Obswap((UInt32**)&AudioData);
  1222.   endhis=LMGetTicks();
  1223.   aratio = (float)(ahis=endhis-starthis) / (amine=starthis-startmine);
  1224.   DisposePtr((Ptr)AudioData);
  1225.   return 0;
  1226. }
  1227.  
  1228. void bswap(UInt32 (*AudioData)[BLKSIZE])
  1229. {
  1230.   register UInt32      *pf = *AudioData;
  1231.   register UInt32      f0,f1,f2,f3;
  1232.   register UInt32      m = 0x00ff00ff;
  1233.  
  1234. #define UNROLL 2
  1235.   { long n = BLKSIZE/UNROLL;
  1236.   do {
  1237.     f0 = pf[0];
  1238.     #if UNROLL > 1
  1239.     f1 = pf[1];
  1240.     #endif
  1241.     #if UNROLL > 2
  1242.     f2 = pf[2];
  1243.     f3 = pf[3];
  1244.     #endif
  1245.     pf[0] = ((f0&m)<<8) | ((f0>>8)&m);
  1246.     #if UNROLL > 1
  1247.     pf[1] = ((f1&m)<<8) | ((f1>>8)&m);
  1248.     #endif
  1249.     #if UNROLL > 2
  1250.     pf[2] = ((f2&m)<<8) | ((f2>>8)&m);
  1251.     pf[3] = ((f3&m)<<8) | ((f3>>8)&m);
  1252.     #endif
  1253.     pf += UNROLL;
  1254.     } while ( --n ); }
  1255. }
  1256.  
  1257. void Obswap(UInt32 **AudioData)
  1258. {
  1259. UInt32      *FramePtr;
  1260. UInt32      *FrameEnd;
  1261. UInt32      Frame;
  1262.  
  1263.  
  1264.     for (FramePtr = (UInt32*)*AudioData,FrameEnd = FramePtr +
  1265. 441000;FramePtr < FrameEnd;FramePtr++)
  1266.     {
  1267.         Frame = *FramePtr;
  1268.         Frame = ((Frame >> 8) & 0x00FF00FF) | ((Frame << 8) & 0xFF00FF00);
  1269.         *FramePtr = Frame;
  1270.     }
  1271. }
  1272. -- 
  1273. Jim Hill
  1274. jthill@netcom.com      PGPrint 6B 85 76 D1 EF BA 2C 78  12 25 8A 5A BF F3 37 7E
  1275.  
  1276. +++++++++++++++++++++++++++
  1277.  
  1278. >From Turlough_O'Connor@qmgate.corp.apple.com (Turlough O'Connor)
  1279. Date: Wed, 05 Apr 1995 18:58:06 +0100
  1280. Organization: Contractor, Apple Computer Ltd, Cork, Ireland
  1281.  
  1282. In article <chris-b-0404951555040001@hmu7.cs.auckland.ac.nz>,
  1283. chris-b@cs.auckland.ac.nz wrote:
  1284. > I have a handle to a buffer containing the audio data, each four bytes
  1285. > contains a left and right sample (each 16 bits). The bytes within each
  1286. > sample need reversing.
  1287. > Currently my code looks something like this:
  1288. >
  1289. - -----------------------------------------------------------------------------
  1290. > Handle  AudioData;
  1291. > UInt32  i;
  1292. > UInt32  Frame;
  1293. >     for (i = 0;i < 441000;i++)
  1294. >     {
  1295. >         Frame = ((UInt32*)(*AudioData))[i];
  1296. >         Frame = ((Frame >> 8) & 0x00FF00FF) | ((Frame << 8) & 0xFF00FF00);
  1297. >         ((UInt32*)(*AudioData))[i] = Frame;
  1298. >     }
  1299. >
  1300. - -----------------------------------------------------------------------------
  1301. > Does anybody have a better version (in C, for 68K or PPC)? Please post it
  1302. > and forward me an e-mail copy. 
  1303.  
  1304. Well, for a start, dereference the 'AudioData' handle outside of the loop,
  1305. e.g., 
  1306.  
  1307.     register UInt32 *audioDataPtr = (UInt32 *)*AudioData;
  1308.  
  1309. And use 'audioDataPtr' inside your loop.
  1310. Note! This will work only as long as your loop doesn't move memory, in
  1311. which case you should lock/unlock your handle appropriately.
  1312.  
  1313. A further optimisation can be made on the 68K:
  1314.  
  1315. #pragma parameter __D0 ByteSwapLong(__D0)
  1316. unsigned long ByteSwapLong(unsigned long val) THREEWORDINLINE(
  1317.         0xe058,                     //  ror.w   #8, d0
  1318.         0x4840,                     //  swap    d0
  1319.         0xe058);                    //  ror.w   #8, d0
  1320.  
  1321. You should thus be able to say something like
  1322.  
  1323.     UInt32 *audioDataPtr = (UInt32 *)*AudioData;
  1324.  
  1325.     for (i = 0; i < 441000; ++i)
  1326.         audioDataPtr[i] = ByteSwapLong(audioDataPtr[i]);
  1327.  
  1328. For PPC, the 'rwlinm' instruction may be useful, but unfortunately I've
  1329. not got access to the PPC manual at the moment... (and to be honest, my
  1330. PPC asm isn't up to much yet!)
  1331.  
  1332. Have fun!
  1333.  
  1334. --turly
  1335.  
  1336. -- 
  1337. Is it *really* just a coincidence that jGNEFilter == 666?
  1338. turlough_o'connor@qmgate.corp.apple.com     turly@applelink.apple.com
  1339.  
  1340. +++++++++++++++++++++++++++
  1341.  
  1342. >From des7f@tweety.ipc.virginia.edu. (Dave Sappington)
  1343. Date: Thu, 6 Apr 1995 06:44:50 GMT
  1344. Organization: Institute for Parallel Computation
  1345.  
  1346. In article <chris-b-0404951555040001@hmu7.cs.auckland.ac.nz>
  1347. chris-b@cs.auckland.ac.nz (chris-b) writes:
  1348.  
  1349. > Handle  AudioData;
  1350. > UInt32  i;
  1351. > UInt32  Frame;
  1352. >     for (i = 0;i < 441000;i++)
  1353. >     {
  1354. >         Frame = ((UInt32*)(*AudioData))[i];
  1355. >         Frame = ((Frame >> 8) & 0x00FF00FF) | ((Frame << 8) & 0xFF00FF00);
  1356. >         ((UInt32*)(*AudioData))[i] = Frame;
  1357. >     }
  1358.  
  1359. Here's a 68K version of your function (Think C flavor; don't know how
  1360. CW handles it). I don't know PPC assembly so I can't help you there.
  1361.  
  1362. Dave
  1363.  
  1364. ==========================
  1365. #define N_SAMPLE 441000L
  1366. #define UNROLL_FACTOR   2
  1367.  
  1368. void SwapAudio ( Handle h )
  1369. {
  1370.    asm {
  1371.        move.l  h,a0           ; deref
  1372.        move.l  (a0),a0        ;   handle
  1373.        move.l  #N_SAMPLE/2,d1
  1374.        move.l  d1,d2          ; split counter into two shorts 'cause
  1375.        swap    d2             ;  I can't recall the 32-bit dbra form
  1376.        bra.s   @2
  1377.    @1
  1378.        move.l  (a0),d0        ; grab from memory
  1379.        ror.w   #8,d0          ; swap chars in low short
  1380.        swap    d0             ; swap shorts
  1381.        ror.w   #8,d0          ; swap chars in high short
  1382.        swap    d0             ; swap shorts ( back to original order )
  1383.        move.l  d0,(a0)+       ; put back in memory and auto-increment
  1384.  
  1385.        move.l  (a0),d0         ; gratuitous unrolling of the loop
  1386.        ror.w   #8,d0
  1387.        swap    d0
  1388.        ror.w   #8,d0
  1389.        swap    d0
  1390.        move.l  d0,(a0)+
  1391.  
  1392.    @2  dbra    d1,@1           ; use two 16-bit countdowns 'cause
  1393.        dbra    d2,@1           ;  I can't recall the 32-bit dbra form
  1394.    }
  1395. }
  1396.  
  1397. Dave Sappington                     des7f@virginia.edu
  1398. Institute for Parallel Computation  University of Virginia
  1399.  
  1400. +++++++++++++++++++++++++++
  1401.  
  1402. >From Turlough_O'Connor@qmgate.corp.apple.com (Turlough O'Connor)
  1403. Date: Thu, 06 Apr 1995 12:41:39 +0100
  1404. Organization: Contractor, Apple Computer Ltd, Cork, Ireland
  1405.  
  1406. In article
  1407. <something-my-newsreader-has-forgotten-and-probably-never-posted-anyway-dammit>,
  1408. I said:
  1409.  
  1410. >In article <chris-b-0404951555040001@hmu7.cs.auckland.ac.nz>,
  1411. >chris-b@cs.auckland.ac.nz wrote:
  1412. >
  1413. >>Handle  AudioData;
  1414. >>UInt32  i;
  1415. >>UInt32  Frame;
  1416. >>
  1417. >>    for (i = 0;i < 441000;i++)
  1418. >>    {
  1419. >>       Frame = ((UInt32*)(*AudioData))[i];
  1420. >>        Frame = ((Frame >> 8) & 0x00FF00FF) | ((Frame << 8) & 0xFF00FF00);
  1421. >>        ((UInt32*)(*AudioData))[i] = Frame;
  1422. >>    }
  1423. >>
  1424. >
  1425. >Well, for a start, dereference the 'AudioData' handle outside of the loop,
  1426. >e.g.,
  1427. >
  1428. >    register UInt32 *audioDataPtr = (UInt32 *)*AudioData;
  1429. >
  1430. >And use 'audioDataPtr' inside your loop.
  1431. >Note! This will work only as long as your loop doesn't move memory, in
  1432. >which case you should lock/unlock your handle appropriately.
  1433. >
  1434. >A further optimisation can be made on the 68K:
  1435. >
  1436. >#pragma parameter __D0 ByteSwapLong(__D0)
  1437. >unsigned long ByteSwapLong(unsigned long val) THREEWORDINLINE(
  1438. >        0xe058,                     //  ror.w   #8, d0
  1439. >        0x4840,                     //  swap    d0
  1440. >        0xe058);                    //  ror.w   #8, d0
  1441. >
  1442. >You should thus be able to say something like
  1443. >
  1444. >    UInt32 *audioDataPtr = (UInt32 *)*AudioData;
  1445. >
  1446. >    for (i = 0; i < 441000; ++i)
  1447. >        audioDataPtr[i] = ByteSwapLong(audioDataPtr[i]);
  1448. >
  1449. >For PPC, the 'rwlinm' instruction may be useful, but unfortunately I've
  1450. >not got access to the PPC manual at the moment... (and to be honest, my
  1451. >PPC asm isn't up to much yet!)
  1452. >
  1453. >Have fun!
  1454.  
  1455.  
  1456. WHOOPS!  I've just realised that my ByteSwapLong macro will actually
  1457. reverse your left and right channels as well!  You need an additional
  1458. 'swap d0' at the end if you just want to swap the bytes in the words:
  1459.  
  1460. unsigned long ByteSwapLong(unsigned long val) FOURWORDINLINE(
  1461.         0xe058,                     //  ror.w   #8, d0
  1462.         0x4840,                     //  swap    d0
  1463.         0xe058,                     //  ror.w   #8, d0
  1464.         0x4840);                    //  swap    d0
  1465.  
  1466. Some experimentation may be in order; it might be quicker on certain CPUs
  1467. to pickup and swap words (shorts) at a time.  Possibly.
  1468. You could use 
  1469.    unsigned short ByteSwapWord(unsigned short val) ONEWORDINLINE(0xe058);
  1470.  
  1471.  
  1472. Alternatively, you might like to try the following 68K asm
  1473. (which is off the top of my head, and might therefore be wrong)
  1474.  
  1475. ;; pascal void ReverseBytesInWordPairs(short *bufPtr, unsigned long nElems)
  1476. ;;
  1477. ;;   bufPtr points to ARRAY[1..nElems] OF RECORD
  1478. ;;                                          leftData, rightData : SHORT
  1479. ;;                                        END;
  1480. ;; Pardon my Pascal.
  1481.  
  1482. REVERSEBYTESINWORDPAIRS PROC EXPORT
  1483.     move.l  (Sp)+, a1               ;; return address
  1484.     move.l  (Sp)+, d1               ;; nElems -- SETS FLAGS
  1485.     move.l  (Sp)+, a0               ;; bufPtr -- **DOESN'T** set flags
  1486.     beq.s   @end                    ;; Note!! branches if 'd1' == 0.
  1487. @1
  1488.     move.l  (a0), d0                ;; pickup left + right channel words
  1489.     ror.w   #8, d0                  ;; byteswap right channel
  1490.     swap    d0
  1491.     ror.w   #8, d0                  ;; byteswap left channel
  1492.     swap    d0
  1493.     move.l  d0, (a0)+               ;; write out in place
  1494.     subq.l  #1, d1
  1495.     bne.s   @1                      ;; counter
  1496. @end
  1497.     jmp     a1                      ;; finished!
  1498.     ENDP                            ;; ReverseBytesInWordPairs
  1499.  
  1500. Although a good C compiler should be able to produce code more or less
  1501. like this from your original.
  1502.  
  1503. Anyway, sorry for any confusion, and 
  1504.  
  1505. Have Fun!
  1506.  
  1507. -turly
  1508.  
  1509. -- 
  1510. Is it *really* just a coincidence that jGNEFilter == 666?
  1511. turlough_o'connor@qmgate.corp.apple.com     turly@applelink.apple.com
  1512.  
  1513. +++++++++++++++++++++++++++
  1514.  
  1515. >From AppleGG@lamg.com (Gordon Apple)
  1516. Date: 06 Apr 1995 22:23:34 GMT
  1517. Organization: Los Angeles Macintosh Group BBS
  1518.  
  1519.      I'm willing to bet that what you have suggested is about as good as
  1520. you're going to get, depending on what optimizations the compiler makes.  You
  1521. could find different ways to write the statement, e.g., avoiding the local
  1522. variable, but it wouldn't help the actual computation.
  1523.  
  1524.       Optimizing the operations depends heavily on what processor is being
  1525. used.  The local variable "Frame" should be a register and the two masks
  1526. should also be stored first in registers.  If using a DSP or multi-ALU
  1527. processor, the loop overhead and address computation could be zilch.  The
  1528. throughput in the pipeline could be as little as two or three cycles per loop
  1529. pass.   Heck, we had a multi-ALU-matrix-switched DSP that would have easily
  1530. done that operation (pipelined) in one cycle.  Also, if you could work with
  1531. 64-bit words, you should be able to run twice as fast.
  1532.  
  1533.  
  1534. ========================================================
  1535. ========================================================
  1536. I'm reading audio data from an audio CD and playing it with Sound Manager
  1537. 3.0. The CD data however, is little endian. So I need to byte swap pairs
  1538. in-place.
  1539.  
  1540. I have a handle to a buffer containing the audio data, each four bytes
  1541. contains a left and right sample (each 16 bits). The bytes within each
  1542. sample need reversing.
  1543.  
  1544. Currently my code looks something like this:
  1545.  
  1546. - -----------------------------------------------------------------------------
  1547.  
  1548. Handle  AudioData;
  1549. UInt32  i;
  1550. UInt32  Frame;
  1551.  
  1552.     for (i = 0;i < 441000;i++)
  1553.     {
  1554.         Frame = ((UInt32*)(*AudioData))[i];
  1555.         Frame = ((Frame >> 8) & 0x00FF00FF) | ((Frame << 8) & 0xFF00FF00);
  1556.         ((UInt32*)(*AudioData))[i] = Frame;
  1557.     }
  1558.  
  1559. - -----------------------------------------------------------------------------
  1560.  
  1561. Does anybody have a better version (in C, for 68K or PPC)? Please post it
  1562. and forward me an e-mail copy. 
  1563.  
  1564.  
  1565. +++++++++++++++++++++++++++
  1566.  
  1567. >From AppleGG@lamg.com (Gordon Apple)
  1568. Date: 06 Apr 1995 22:23:34 GMT
  1569. Organization: Los Angeles Macintosh Group BBS
  1570.  
  1571.      I'm willing to bet that what you have suggested is about as good as
  1572. you're going to get, depending on what optimizations the compiler makes.  You
  1573. could find different ways to write the statement, e.g., avoiding the local
  1574. variable, but it wouldn't help the actual computation.
  1575.  
  1576.       Optimizing the operations depends heavily on what processor is being
  1577. used.  The local variable "Frame" should be a register and the two masks
  1578. should also be stored first in registers.  If using a DSP or multi-ALU
  1579. processor, the loop overhead and address computation could be zilch.  The
  1580. throughput in the pipeline could be as little as two or three cycles per loop
  1581. pass.   Heck, we had a multi-ALU-matrix-switched DSP that would have easily
  1582. done that operation (pipelined) in one cycle.  Also, if you could work with
  1583. 64-bit words, you should be able to run twice as fast.
  1584.  
  1585.  
  1586. ========================================================
  1587. ========================================================
  1588. I'm reading audio data from an audio CD and playing it with Sound Manager
  1589. 3.0. The CD data however, is little endian. So I need to byte swap pairs
  1590. in-place.
  1591.  
  1592. I have a handle to a buffer containing the audio data, each four bytes
  1593. contains a left and right sample (each 16 bits). The bytes within each
  1594. sample need reversing.
  1595.  
  1596. Currently my code looks something like this:
  1597.  
  1598. - -----------------------------------------------------------------------------
  1599.  
  1600. Handle  AudioData;
  1601. UInt32  i;
  1602. UInt32  Frame;
  1603.  
  1604.     for (i = 0;i < 441000;i++)
  1605.     {
  1606.         Frame = ((UInt32*)(*AudioData))[i];
  1607.         Frame = ((Frame >> 8) & 0x00FF00FF) | ((Frame << 8) & 0xFF00FF00);
  1608.         ((UInt32*)(*AudioData))[i] = Frame;
  1609.     }
  1610.  
  1611. - -----------------------------------------------------------------------------
  1612.  
  1613. Does anybody have a better version (in C, for 68K or PPC)? Please post it
  1614. and forward me an e-mail copy. 
  1615.  
  1616.  
  1617. +++++++++++++++++++++++++++
  1618.  
  1619. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  1620. Date: Mon, 10 Apr 1995 14:08:39 +1200 (NZDT)
  1621. Organization: (none)
  1622.  
  1623. des7f@tweety.ipc.virginia.edu. (Dave Sappington) writes:
  1624. > void SwapAudio ( Handle h )
  1625. > {
  1626. >    asm {
  1627. >        move.l  h,a0           ; deref
  1628. >        move.l  (a0),a0        ;   handle
  1629. >        move.l  #N_SAMPLE/2,d1
  1630. >        move.l  d1,d2          ; split counter into two shorts 'cause
  1631. >        swap    d2             ;  I can't recall the 32-bit dbra form
  1632. >        bra.s   @2
  1633. >    @1
  1634. >        move.l  (a0),d0        ; grab from memory
  1635. >        ror.w   #8,d0          ; swap chars in low short
  1636. >        swap    d0             ; swap shorts
  1637. >        ror.w   #8,d0          ; swap chars in high short
  1638. >        swap    d0             ; swap shorts ( back to original order )
  1639. >        move.l  d0,(a0)+       ; put back in memory and auto-increment
  1640. >
  1641. >        move.l  (a0),d0         ; gratuitous unrolling of the loop
  1642. >        ror.w   #8,d0
  1643. >        swap    d0
  1644. >        ror.w   #8,d0
  1645. >        swap    d0
  1646. >        move.l  d0,(a0)+
  1647. >
  1648. >    @2  dbra    d1,@1           ; use two 16-bit countdowns 'cause
  1649. >        dbra    d2,@1           ;  I can't recall the 32-bit dbra form
  1650. >    }
  1651. > }
  1652.  
  1653. There isn't a 32-bit DBRA.  What you did is OK, but you can save a register
  1654. (which are pretty precious on the 68K) at the cost of two extra instructions
  1655. every 65536 loops (i.e. insignificant), with the same code size as you have,
  1656. by doing:
  1657.  
  1658.    move.l  #N_SAMPLE/2,d1
  1659.    bra.s @3
  1660. @1 swap d1
  1661. @2
  1662.    ; your loop body here
  1663.  
  1664. @3 dbra d1,@2
  1665.    swap d1
  1666.    dbra d1,@1
  1667.  
  1668.  
  1669. -- Bruce
  1670.  
  1671. ---------------------------
  1672.  
  1673. >From Gilles Dignard <gdignard@hookup.net>
  1674. Subject: [Q] Getting a list of vRefNums
  1675. Date: 7 Apr 1995 14:37:16 GMT
  1676. Organization: HookUp Communication Corporation, Oakville, Ontario, CANADA
  1677.  
  1678. Is there a way of getting a list of all vRefNums? (Taking into account
  1679. that some volumes may have been mounted / dismounted since startup).
  1680.  
  1681. So, I looked in IM-Files, and found what I thought would work: GetVInfo,
  1682. but that didn't seem to help.
  1683.  
  1684. I looked in the FAQ, and was actually surprised not to see this there.
  1685.  
  1686. - --------------------
  1687. ####      /\      ####  Gilles Dignard - gdignard@hookup.net
  1688. ####  ]\/\  /\/[  ####
  1689. ####  \ \    / /  ####  Paradise is like where you are right
  1690. ####  /--------\  ####  now, only much, much better.
  1691. ####      ][      ####           -- Laurie Anderson
  1692. - --------------------
  1693.  
  1694. +++++++++++++++++++++++++++
  1695.  
  1696. >From skevill@tartarus.uwa.edu.au (Scott Kevill)
  1697. Date: 8 Apr 1995 03:58:14 GMT
  1698. Organization: The University of Western Australia
  1699.  
  1700. Gilles Dignard (gdignard@hookup.net) wrote:
  1701. : Is there a way of getting a list of all vRefNums? (Taking into account
  1702. : that some volumes may have been mounted / dismounted since startup).
  1703.  
  1704. : So, I looked in IM-Files, and found what I thought would work: GetVInfo,
  1705. : but that didn't seem to help.
  1706.  
  1707. : I looked in the FAQ, and was actually surprised not to see this there.
  1708.  
  1709. : ----------------------
  1710. : ####      /\      ####  Gilles Dignard - gdignard@hookup.net
  1711. : ####  ]\/\  /\/[  ####
  1712. : ####  \ \    / /  ####  Paradise is like where you are right
  1713. : ####  /--------\  ####  now, only much, much better.
  1714. : ####      ][      ####           -- Laurie Anderson
  1715. : ----------------------
  1716.  
  1717. You can't use GetVInfo to do this as it doesn't take a volume index
  1718. as a parameter. Use PBHGetVInfo like this:
  1719.  
  1720.     HVolumeParam            pb;
  1721.     OSErr                   err;
  1722.     short                   index;
  1723.     
  1724.     pb.ioCompletion = NULL;
  1725.     pb.ioNamePtr = NULL;
  1726.     pb.ioVRefNum = 0;
  1727.     err = noErr;
  1728.     for (index=1; err != nsvErr; index ++) {
  1729.         pb.ioVolIndex = index;
  1730.         err = PBHGetVInfo(&pb, FALSE);
  1731.         if (err == noErr) {
  1732.             /* ... do what you want with pb.ioVRefNum ... */
  1733.         }
  1734.     }
  1735.  
  1736. Hope this helps.
  1737.  
  1738. Scott Kevill
  1739.  
  1740. skevill@tartarus.uwa.edu.au
  1741.  
  1742.  
  1743. +++++++++++++++++++++++++++
  1744.  
  1745. >From jumplong@aol.com (Jump Long)
  1746. Date: 8 Apr 1995 18:30:51 -0400
  1747. Organization: America Online, Inc. (1-800-827-6364)
  1748.  
  1749. >Is there a way of getting a list of all vRefNums? (Taking into account
  1750. >that some volumes may have been mounted / dismounted since startup).
  1751. >
  1752. >So, I looked in IM-Files, and found what I thought would work: GetVInfo,
  1753. >but that didn't seem to help.
  1754. >
  1755. >I looked in the FAQ, and was actually surprised not to see this there.
  1756.  
  1757. I think the FAQ refers you to MoreFiles for common File Manager related
  1758. routines.
  1759.  
  1760. In MoreFiles, you'll find a routine named OnLine that fills an array of
  1761. FSSpecs with an FSSpec for each mounted volume.  You can use the code as
  1762. is and retrieve the vRefNums from the FSSpecs, or you can use it as an
  1763. example of how to index through the currently mounted volumes.
  1764.  
  1765. - Jim Luther
  1766.  
  1767. ---------------------------
  1768.  
  1769. >From muffinhead@ins.infonet.net (MuffinHead)
  1770. Subject: __MAC__?
  1771. Date: 4 Apr 1995 11:32:54 GMT
  1772. Organization: Armpit Studios VII
  1773.  
  1774. I'm working on the Mac end of a cross-platform app. Is there a standard
  1775. #define in all Mac C compilers that lets the compiler know that the source
  1776. is being compiled on a Mac? For example, here's one line of our code:
  1777.  
  1778.   #if (defined(__STDC__) && !defined(__HIGHC__) && !(defined(i386) &&
  1779.   defined(MACH))) || (defined(sgi) && defined(__EXTENSIONS__))
  1780.  
  1781. and another:
  1782.  
  1783.   #ifdef VAXC
  1784.  
  1785. What I need is something like:
  1786.  
  1787.   #if defined(__MAC__)
  1788.  
  1789. I know that I could use defined(__MWERKS__) || defined(otherMacCompilers)
  1790. || etc, but that seems a little kludgy. I couldn't find any such thing in
  1791. MacHeaders.
  1792.  
  1793. Muff                                               Armpit Studios VII
  1794. Drummer, Mac geek                                       Iowa City, IA
  1795. _____________________________________________________________________
  1796. Boy, giraffes are selfish.
  1797.   --Deputy Barnard [P.|Milton|Oliver] Fife
  1798.  
  1799. +++++++++++++++++++++++++++
  1800.  
  1801. >From troika@panix.com (Mark Coniglio)
  1802. Date: 4 Apr 1995 13:20:57 GMT
  1803. Organization: Troika Ranch
  1804.  
  1805. In article <muffinhead-0404950632590001@s045.infonet.net>,
  1806. muffinhead@ins.infonet.net (MuffinHead) wrote:
  1807.  
  1808. > I'm working on the Mac end of a cross-platform app. Is there a standard
  1809. > #define in all Mac C compilers that lets the compiler know that the source
  1810. > is being compiled on a Mac? For example, here's one line of our code:
  1811. >   #if (defined(__STDC__) && !defined(__HIGHC__) && !(defined(i386) &&
  1812. >   defined(MACH))) || (defined(sgi) && defined(__EXTENSIONS__))
  1813. > and another:
  1814. >   #ifdef VAXC
  1815. > What I need is something like:
  1816. >   #if defined(__MAC__)
  1817. > I know that I could use defined(__MWERKS__) || defined(otherMacCompilers)
  1818. > || etc, but that seems a little kludgy. I couldn't find any such thing in
  1819. > MacHeaders.
  1820.  
  1821. If you are reading in the basic Mac headers,
  1822. you might just try checking for __QUICKDRAW__ as it is unlikely
  1823. that such a header definition would exist under Windows. ;-)
  1824.  
  1825. -- 
  1826. Mark Coniglio -- Troika Ranch / Dance Theater
  1827.  
  1828. mail: troika@panix.com
  1829. http: www.art.net/Studios/Performance/Dance/Troika_Ranch/TroikaHome.html
  1830.  
  1831. +++++++++++++++++++++++++++
  1832.  
  1833. >From woody@alumni.cco.caltech.edu (William Edward Woody)
  1834. Date: Tue, 04 Apr 1995 12:41:45 -0800
  1835. Organization: In Phase Consulting
  1836.  
  1837. muffinhead@ins.infonet.net (MuffinHead) wrote:
  1838.  
  1839. > What I need is something like:
  1840. >   #if defined(__MAC__)
  1841. > I know that I could use defined(__MWERKS__) || defined(otherMacCompilers)
  1842. > || etc, but that seems a little kludgy. I couldn't find any such thing in
  1843. > MacHeaders.
  1844.  
  1845. What I did was to modify the MacHeaders to add the statement
  1846.  
  1847. #define __MACINTOSH__   1
  1848.  
  1849. and then precompile MacHeaders.
  1850.  
  1851. On the Windows software I write, I predefine (using Borland's or Microsoft's
  1852. ability to predefine a symbol from the command line) the symbol
  1853.  
  1854. #define __WINDOWS__     1
  1855.  
  1856. for the same functionality under Windows.
  1857.  
  1858. Works for me, though it means handing someone else the source kit is a
  1859. little problamatical... :-(
  1860.  
  1861.                                                         - Bill
  1862.  
  1863. -- 
  1864. William Edward Woody     |  e-mail: woody@alumni.cco.caltech.edu
  1865. In Phase Consulting      |  WWW:    http://alumni.caltech.edu/~woody
  1866. 337 West California #4   |  Fax:    (818) 502-1467
  1867. Glendale, CA 91203       |  ICBM:   N:34.4' W:118.15'
  1868.  
  1869. +++++++++++++++++++++++++++
  1870.  
  1871. >From muffinhead@ins.infonet.net (MuffinHead)
  1872. Date: 5 Apr 1995 08:51:33 GMT
  1873. Organization: Armpit Studios VII
  1874.  
  1875.    Thanks for the tips. I think I'll go with the QuickDraw define since
  1876. this code is public domain.
  1877.  
  1878. Muff                                               Armpit Studios VII
  1879. Drummer, Mac geek                                       Iowa City, IA
  1880. _____________________________________________________________________
  1881. Boy, giraffes are selfish.
  1882.   --Deputy Barnard [P.|Milton|Oliver] Fife
  1883.  
  1884. +++++++++++++++++++++++++++
  1885.  
  1886. >From mattm@apple.com (Matthew Melmon)
  1887. Date: Mon, 10 Apr 1995 06:52:25 GMT
  1888. Organization: Apple Computer, Inc.
  1889.  
  1890. > In article <muffinhead-0404950632590001@s045.infonet.net>,
  1891. > muffinhead@ins.infonet.net (MuffinHead) wrote:
  1892. > > I'm working on the Mac end of a cross-platform app. Is there a standard
  1893. > > #define in all Mac C compilers that lets the compiler know that the source
  1894. > > is being compiled on a Mac? For example, here's one line of our code:
  1895.  
  1896. The following conditional macros exist for determining platform:
  1897.  
  1898.  GENERATINGPOWERPC
  1899.  GENERATING68K
  1900.  GENERATINGCFM
  1901.  
  1902. They are particularly useful when tweaking an app which spans
  1903. the PowerPC and 68K platform.  GENERATINGCFM is defined for both
  1904. PowerPC and the new CFM 68K runtime.  You may also use __CFM68K__
  1905. for the latter (when, for example, you want to turn on exports
  1906. on and off in a header file).
  1907.  
  1908. -- 
  1909. *X*
  1910. Splatasha, Queen of the Damned (Vanishing Sig)
  1911.  
  1912. ---------------------------
  1913.  
  1914. End of C.S.M.P. Digest
  1915. **********************
  1916.